// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/blink/texttrack_impl.h"

#include <utility>

#include "base/bind.h"
#include "base/location.h"
#include "base/single_thread_task_runner.h"
#include "media/base/bind_to_current_loop.h"
#include "media/blink/webinbandtexttrack_impl.h"
#include "third_party/WebKit/public/platform/WebInbandTextTrackClient.h"
#include "third_party/WebKit/public/platform/WebMediaPlayerClient.h"

namespace media {

TextTrackImpl::TextTrackImpl(
    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
    blink::WebMediaPlayerClient* client,
    std::unique_ptr<WebInbandTextTrackImpl> text_track)
    : task_runner_(task_runner)
    , client_(client)
    , text_track_(std::move(text_track))
{
    client_->addTextTrack(text_track_.get());
}

TextTrackImpl::~TextTrackImpl()
{
    task_runner_->PostTask(
        FROM_HERE,
        base::Bind(&TextTrackImpl::OnRemoveTrack,
            client_,
            base::Passed(&text_track_)));
}

void TextTrackImpl::addWebVTTCue(const base::TimeDelta& start,
    const base::TimeDelta& end,
    const std::string& id,
    const std::string& content,
    const std::string& settings)
{
    task_runner_->PostTask(
        FROM_HERE,
        base::Bind(&TextTrackImpl::OnAddCue,
            text_track_.get(),
            start, end,
            id, content, settings));
}

void TextTrackImpl::OnAddCue(WebInbandTextTrackImpl* text_track,
    const base::TimeDelta& start,
    const base::TimeDelta& end,
    const std::string& id,
    const std::string& content,
    const std::string& settings)
{
    if (blink::WebInbandTextTrackClient* client = text_track->client()) {
        client->addWebVTTCue(start.InSecondsF(),
            end.InSecondsF(),
            blink::WebString::fromUTF8(id),
            blink::WebString::fromUTF8(content),
            blink::WebString::fromUTF8(settings));
    }
}

void TextTrackImpl::OnRemoveTrack(
    blink::WebMediaPlayerClient* client,
    std::unique_ptr<WebInbandTextTrackImpl> text_track)
{
    if (text_track->client())
        client->removeTextTrack(text_track.get());
}

} // namespace media
